const fs = require('fs');
const path = require('path');
const ffmpeg = require('fluent-ffmpeg');

class VideoFrameExtractor {
  constructor(config) {
    this.config = config;
    this.ensureOutputDir();
  }

  // 确保输出目录存在
  ensureOutputDir() {
    if (!fs.existsSync(this.config.outputDir)) {
      fs.mkdirSync(this.config.outputDir, { recursive: true });
      console.log(`创建输出目录: ${this.config.outputDir}`);
    }
  }

  // 配置ffmpeg路径
  configureFfmpeg(defaultPath) {
    // 优先使用用户提供的路径，如果没有则使用默认路径
    this.ffmpegPath = this.config.ffmpegExecPath || defaultPath;
    if (this.ffmpegPath) {
      ffmpeg.setFfmpegPath(this.ffmpegPath);
      
      // 尝试配置ffprobe（可选）
      const ffprobePath = this.ffmpegPath.replace('ffmpeg.exe', 'ffprobe.exe');
      if (fs.existsSync(ffprobePath)) {
        ffmpeg.setFfprobePath(ffprobePath);
      }
    }
  }

  // 格式化序号，确保两位数
  formatFrameNumber(number) {
    return number.toString().padStart(2, '0');
  }

  // 提取视频帧
  extractFrames(mainWindow) {
    return new Promise((resolve, reject) => {
      // 验证视频文件是否存在
      if (!fs.existsSync(this.config.videoPath)) {
        const error = new Error(`视频文件不存在: ${this.config.videoPath}`);
        reject(error);
        return;
      }

      // 从视频路径提取文件名作为前缀（去掉扩展名）
      const videoFilename = path.basename(this.config.videoPath);
      const videoNameWithoutExt = videoFilename.substring(0, videoFilename.lastIndexOf('.'));
      const prefix = this.config.frameNamePrefix || videoNameWithoutExt;

      const outputPattern = path.join(
        this.config.outputDir,
        `${prefix}-%02d.${this.config.frameFormat}`
      );

      // 创建ffmpeg实例并显式指定ffmpeg路径
      const ffmpegCommand = ffmpeg(this.config.videoPath);
      if (this.ffmpegPath) {
        ffmpegCommand.setFfmpegPath(this.ffmpegPath);
      }
      
      ffmpegCommand
        .on('end', () => {
          resolve({ success: true, message: '视频帧提取完成' });
        })
        .on('error', err => {
          reject(err);
        })
        .on('progress', (progress) => {
          if (progress.percent && mainWindow) {
            mainWindow.webContents.send('progress-update', {
              type: 'extract-frames',
              progress: Math.round(progress.percent)
            });
          }
        })
        .output(outputPattern)
        .outputOptions(['-vf fps=1/1', '-start_number 1']) // 每秒1帧，从1开始编号
        .run();
    });
  }
}

// 导出类
module.exports = VideoFrameExtractor;